Struts2 入门实例代码 - jamesby - ITeye技术网站

创建时间:2015/8/28 13:25
来源:http://jamesby.iteye.com/blog/65208


Struts.xml 文件

Java代码
 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <constant name="struts.enable.DynamicMethodInvocation" value="true" />  
  7.     <constant name="struts.devMode" value="true" />  
  8.     <include file="helloworld.xml"/>  
  9. </struts>  


HelloWorld.xml

Java代码
 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.         "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <include file="struts-default.xml"/>  
  7.     <package name="helloworld" namespace="/" extends="struts-default">  
  8.         <interceptors>  
  9.             <interceptor name ="authentication" class ="com.jamesby.struts2.LogonInterceptor"/>   
  10.             <interceptor-stack name="helloWorldStack">  
  11.                 <interceptor-ref name="authentication"/>  
  12.                 <interceptor-ref name="paramsPrepareParamsStack"/>  
  13.             </interceptor-stack>  
  14.         </interceptors>    
  15.         <default-interceptor-ref name="helloWorldStack"/>  
  16.         <global-results>  
  17.             <result name="login">/WEB-INF/jsp/Logon.jsp</result>                  
  18.                   </global-results>         
  19.         <action name="Logon_*" method="{1}" class="com.jamesby.struts2.Logon">  
  20.             <interceptor-ref name="paramsPrepareParamsStack"/>          
  21.             <result type="redirect-action">Main</result>  
  22.             <result name="input">/WEB-INF/jsp/Logon.jsp</result>          
  23.         </action>  
  24.         <action name="crud" method="{1}" class="com.jamesby.struts2.UserAction">  
  25.             <result name="list">/WEB-INF/jsp/userList.jsp</result>              <result name="success" type="redirect-action">crud!list</result>  
  26.             <result name="input">/WEB-INF/jsp/userForm.jsp</result>  
  27.         </action>  
  28.         <action name="*" class="com.jamesby.struts2.ExampleSupport">  
  29.             <result>/WEB-INF/jsp/{1}.jsp</result>  
  30.         </action>           
  31.     </package>  
  32. </struts>  


LogonInterceptor.java

Java代码
 收藏代码
  1. package com.jamesby.struts2;  
  2. import java.util.Map;  
  3. import com.jamesby.struts2.persist.User;  
  4. import com.opensymphony.xwork2.Action;  
  5. import com.opensymphony.xwork2.ActionInvocation;  
  6. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  7. public class LogonInterceptor extends AbstractInterceptor{  
  8.     @Override  
  9.     public String intercept(ActionInvocation ai) throws Exception {  
  10.         Map session = ai.getInvocationContext().getSession();  
  11.         User user = (User) session.get("user");  
  12.         if (null != user) {  
  13.             return ai.invoke();  
  14.         } else {  
  15.             return Action.LOGIN;  
  16.         }  
  17.     }  
  18. }  


Logon.java

Java代码
 收藏代码
  1. package com.jamesby.struts2;  
  2. import java.util.Map;  
  3. import org.apache.struts2.interceptor.SessionAware;  
  4. import org.apache.struts2.interceptor.validation.SkipValidation;  
  5. import com.jamesby.struts2.persist.DataBaseMock;  
  6. import com.jamesby.struts2.persist.User;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8. public class Logon extends ActionSupport implements SessionAware {  
  9.     private Map session;  
  10.     public void setSession(Map session) {  
  11.         this.session = session;  
  12.     }  
  13.     @SkipValidation  
  14.     public String doInput() throws Exception {  
  15.         return INPUT;  
  16.     }  
  17.     public String doLogon() throws Exception {  
  18.         User user = DataBaseMock.selectUserByUsernameAndPassword(getUsername(),  
  19.                 getPassword());  
  20.         if (null == user)  
  21.             return INPUT;  
  22.         session.put("user", user);  
  23.         return SUCCESS;  
  24.     }  
  25.     private String username;  
  26.     public String getUsername() {  
  27.         return username;  
  28.     }  
  29.     public void setUsername(String username) {  
  30.         this.username = username;  
  31.     }  
  32.     private String password;  
  33.     public String getPassword() {  
  34.         return password;  
  35.     }  
  36.     public void setPassword(String password) {  
  37.         this.password = password;  
  38.     }  
  39. }  


UserAction.java

Java代码
 收藏代码
  1. package com.jamesby.struts2;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import org.apache.struts2.interceptor.validation.SkipValidation;  
  6. import com.jamesby.struts2.persist.DataBaseMock;  
  7. import com.jamesby.struts2.persist.User;  
  8. import com.opensymphony.xwork2.ActionSupport;  
  9. public class UserAction  extends ActionSupport {  
  10.     private User user=new User();  
  11.     private List<User> userList;  
  12.     public List<HashMap> getSexArray() {  
  13.         List<HashMap> sexArray = new ArrayList<HashMap>();  
  14.         HashMap male = new HashMap();  
  15.         male.put("key",new Integer(1));  
  16.         male.put("value","男");  
  17.         HashMap female = new HashMap();  
  18.         female.put("key",new Integer(2));  
  19.         female.put("value","女");          
  20.         sexArray.add(male);  
  21.         sexArray.add(female);  
  22.         return sexArray;  
  23.     }     
  24.     public List<HashMap> getFromArray() {  
  25.         List<HashMap> fromArray = new ArrayList<HashMap>();  
  26.         HashMap bj = new HashMap();  
  27.         bj.put("id",new Integer(1));  
  28.         bj.put("name","北京");  
  29.         HashMap sh = new HashMap();  
  30.         sh.put("id",new Integer(2));  
  31.         sh.put("name","上海");          
  32.         HashMap tj = new HashMap();  
  33.         tj.put("id",new Integer(3));  
  34.         tj.put("name","天津");  
  35.         fromArray.add(bj);  
  36.         fromArray.add(sh);  
  37.         fromArray.add(tj);  
  38.         return fromArray;  
  39.     }  
  40.     @SkipValidation  
  41.     public String doList() throws Exception {  
  42.         userList = DataBaseMock.selectAllUser();  
  43.         return "list";  
  44.     }  
  45.     @SkipValidation  
  46.     public String doInput() {  
  47.         return INPUT;  
  48.     }     
  49.     public String doSave() {  
  50.         if (null == user.getUserid()) {  
  51.             user.setUserid(new Integer(DataBaseMock.getNewUserId()));  
  52.             DataBaseMock.saveUser(user);  
  53.         }else  
  54.         {  
  55.             DataBaseMock.updateUser(user);  
  56.         }  
  57.         return SUCCESS;  
  58.     }  
  59.     @SkipValidation  
  60.     public String doRead()  
  61.     {  
  62.         user = DataBaseMock.getUser(user.getUserid());  
  63.         return INPUT;  
  64.     }  
  65.     @SkipValidation  
  66.     public String doDelete() {  
  67.         DataBaseMock.deleteUser(user);  
  68.         return SUCCESS;  
  69.     }         
  70.     public List<User> getUserList() {  
  71.         return userList;  
  72.     }  
  73.     public void setUserList(List<User> userList) {  
  74.         this.userList = userList;  
  75.     }  
  76.     public User getUser() {  
  77.         return user;  
  78.     }  
  79.     public void setUser(User user) {  
  80.         this.user = user;  
  81.     }  
  82. }  


ExampleSupport.java

Java代码
 收藏代码
  1. package com.jamesby.struts2;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. public class ExampleSupport extends ActionSupport {  
  4. }  


User.java

Java代码
 收藏代码
  1. package com.jamesby.struts2.persist;  
  2. public class User {  
  3.     private Integer userid;  
  4.     private String username;  
  5.     private String password;  
  6.     private int sex;  
  7.     private int age;  
  8.     private int from;  
  9.     public int getFrom() {  
  10.         return from;  
  11.     }  
  12.     public void setFrom(int from) {  
  13.         this.from = from;  
  14.     }  
  15.     public String getPassword() {  
  16.         return password;  
  17.     }  
  18.     public void setPassword(String password) {  
  19.         this.password = password;  
  20.     }  
  21.     public int getSex() {  
  22.         return sex;  
  23.     }  
  24.     public void setSex(int sex) {  
  25.         this.sex = sex;  
  26.     }  
  27.     public Integer getUserid() {  
  28.         return userid;  
  29.     }  
  30.     public void setUserid(Integer userid) {  
  31.         this.userid = userid;  
  32.     }  
  33.     public String getUsername() {  
  34.         return username;  
  35.     }  
  36.     public void setUsername(String username) {  
  37.         this.username = username;  
  38.     }  
  39.     public int getAge() {  
  40.         return age;  
  41.     }  
  42.     public void setAge(int age) {  
  43.         this.age = age;  
  44.     }  
  45. }  


DataBaseMock.java

Java代码
 收藏代码
  1. package com.jamesby.struts2.persist;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. public class DataBaseMock {  
  5.     private static List<User> _cache = new ArrayList<User>();  
  6.     private static int userid = 0;  
  7.     static {  
  8.         User user = new User();  
  9.         user.setUserid(new Integer(0));  
  10.         user.setUsername("admin");  
  11.         user.setPassword("12345688");  
  12.         user.setFrom(1);// 北京  
  13.         user.setSex(1);// 男  
  14.         user.setAge(18);  
  15.         _cache.add(user);  
  16.     }  
  17.     public static User selectUserByUsernameAndPassword(String username,String password)  
  18.     {  
  19.         for (User u : _cache) {  
  20.             if (u.getUsername().equals(username)&&u.getPassword().equals(password)) {  
  21.                 return u;  
  22.             }  
  23.         }  
  24.         return null;  
  25.     }  
  26.     public static List<User> selectAllUser()  
  27.     {  
  28.         return _cache;  
  29.     }  
  30.     public static int getNewUserId() {  
  31.         return ++userid;  
  32.     }  
  33.     public static void saveUser(User user) {  
  34.         _cache.add(user);  
  35.     }  
  36.     public static void updateUser(User user) {  
  37.         deleteUser(user);  
  38.         saveUser(user);  
  39.     }  
  40.     public static void deleteUser(User user) {  
  41.         for (User u : _cache) {  
  42.             if (u.getUserid().intValue() == user.getUserid().intValue()) {  
  43.                 _cache.remove(u);  
  44.                 break;  
  45.             }  
  46.         }  
  47.     }  
  48.     public static User getUser(Integer userid) {  
  49.         return _cache.get(userid);  
  50.     }  
  51. }  


Logon-validation.xml

Java代码
 收藏代码
  1. <!DOCTYPE validators PUBLIC   
  2. "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
  3. "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
  4. <validators>  
  5.     <field name="username">  
  6.         <field-validator type="requiredstring">  
  7.             <message key="requiredstring"/>  
  8.         </field-validator>  
  9.     </field>  
  10.     <field name="password">  
  11.         <field-validator type="requiredstring">  
  12.             <message key="requiredstring"/>  
  13.         </field-validator>  
  14.     </field>  
  15. </validators>  


UserAction-validation.xml

Java代码
 收藏代码
  1. <!DOCTYPE validators PUBLIC   
  2. "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
  3. "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
  4. <validators>  
  5.   <field name="user.username">  
  6.      <field-validator type="requiredstring">  
  7.         <message key="errors.required.username"/>  
  8.       </field-validator>  
  9.   </field>  
  10.   <field name="user.password">  
  11.      <field-validator type="requiredstring">  
  12.         <message key="errors.required.password"/>  
  13.       </field-validator>  
  14.   </field>  
  15.   <field name="user.sex">  
  16.      <field-validator type="required">  
  17.         <message key="errors.required.sex"/>  
  18.       </field-validator>  
  19.   </field>    
  20.   <field name="user.age">  
  21.      <field-validator type="required" short-circuit="true">  
  22.         <message key="errors.required.age"/>  
  23.       </field-validator>  
  24.       <field-validator type="int">  
  25.         <param name="min">18</param>  
  26.         <param name="max">65</param>  
  27.         <message key="errors.required.age.limit"/>  
  28.       </field-validator>  
  29.   </field>  
  30.   <field name="user.from">  
  31.      <field-validator type="required">  
  32.         <message key="errors.required.from"/>  
  33.       </field-validator>  
  34.   </field>      
  35. </validators>  


package.properties

Java代码
 收藏代码
  1. requiredstring = $\{getText(fieldName)} is required.  
  2. password = Password  
  3. username = User Name  
  4. main.message = This is main page...................  
  5. label.userList= All User List  
  6.   
  7. user.username=Username  
  8. user.password=Password  
  9. user.sex=Sex  
  10. user.age=Age  
  11. user.from=From  
  12.   
  13. errors.required.username=Username is required  
  14. errors.required.password=Password is required  
  15. errors.required.sex=Sex is Required  
  16. errors.required.from=From is Required  
  17. errors.required.age.limit=Age between 18 and 65  
  18. errors.required.age.limit=Age between 18 and 65  


Logon.jsp

Java代码
 收藏代码
  1. <%@ taglib prefix="s" uri="/struts-tags" %>  
  2. <html>  
  3. <head>  
  4.   <title>Logon</title>  
  5. </head>  
  6. <body>  
  7. <s:form action="Logon!logon">   
  8.   <s:textfield label="%{getText('username')}" name="username"/>  
  9.   <s:password label="%{getText('password')}" name="password" />  
  10.   <s:submit/>  
  11. </s:form>  
  12. </body>  
  13. </html>  


userList.jsp

Java代码
 收藏代码
  1. <%@ page contentType="text/html;charset=GBK"%>  
  2. <%@taglib prefix="s" uri="/struts-tags" %>  
  3.   
  4. <head>  
  5.     <title><s:text name="label.userList"/></title>  
  6. </head>  
  7.   
  8. <s:url id="url" action="crud!input" />  
  9. <a href="<s:property value="#url"/>">Add New User</a>  
  10. <br>  
  11. <table border="1">  
  12.     <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">  
  13.         <td>用户ID</td>  
  14.         <td>用户名</td>  
  15.         <td>性别</td>  
  16.         <td>年龄</td>  
  17.         <td>来自</td>  
  18.         <td>修改</td>  
  19.         <td>删除</td>  
  20.     </tr>   
  21. <s:iterator value="userList" status="status">  
  22.     <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">  
  23.         <td><s:property value="userid" /></td>  
  24.         <td><s:property value="username" /></td>  
  25.         <td>  
  26.             <s:if test="sex==1">男</s:if>  
  27.             <s:else>女</s:else>  
  28.         </td>  
  29.         <td><s:property value="age" /></td>  
  30.         <td>  
  31.             <s:if test="from==1">北京</s:if>  
  32.             <s:if test="from==2">上海</s:if>  
  33.             <s:if test="from==3">天津</s:if>  
  34.         </td>  
  35.         <td>  
  36.             <a href="crud!read.action?user.userid=<s:property value="userid" />">修改</a>  
  37.         </td>  
  38.         <td>  
  39.             <a href="crud!delete.action?user.userid=<s:property value="userid" />">删除</a>  
  40.         </td>  
  41.     </tr>   
  42. </s:iterator>  
  43. </table>  



userForm.jsp

Java代码
 收藏代码
  1. <%@ page contentType="text/html;charset=GBK"%>  
  2. <%@taglib prefix="s" uri="/struts-tags" %>  
  3. User Form  
  4. <s:form action="crud!save.action" method="post">  
  5.     <s:textfield required="true" name="user.username" value="%{user.username}" label="%{getText('user.username')}" size="40"/>  
  6.     <s:textfield required="true" name="user.password" value="%{user.password}" label="%{getText('user.password')}" size="40"/>  
  7.     <s:radio required="true" name="user.sex" listKey="key" listValue="value" value="%{user.sex}" label="%{getText('user.sex')}" list="sexArray"/>  
  8.     <s:textfield required="true" name="user.age" value="%{user.age}" label="%{getText('user.age')}" size="40"/>  
  9.     <s:select label="%{getText('user.from')}" name="user.from" headerKey="" headerValue="Select From" list="fromArray" listKey="id" listValue="name" value="user.from" required="true"/>  
  10.     <s:hidden name="user.userid" value="%{user.userid}"/>  
  11.     <s:submit value="Submit"/>  
  12.     <s:submit value="Cancel" name="redirect-action:crud!list"/>  
  13. </s:form>  


应用程序目录结构

Java代码
 收藏代码
  1. WEB-INF  
  2. │  web.xml  
  3. │  
  4. ├─classes  
  5. │  │  commons-logging.properties  
  6. │  │  helloworld.xml  
  7. │  │  log4j.properties  
  8. │  │  struts.properties  
  9. │  │  struts.xml  
  10. │  │  
  11. │  └─com  
  12. │      └─jamesby  
  13. │          └─struts2  
  14. │              │  ExampleSupport.class  
  15. │              │  Logon-validation.xml  
  16. │              │  Logon.class  
  17. │              │  LogonInterceptor.class  
  18. │              │  package.properties  
  19. │              │  UserAction-validation.xml  
  20. │              │  UserAction.class  
  21. │              │  
  22. │              └─persist  
  23. │                      DataBaseMock.class  
  24. │                      User.class  
  25. │  
  26. ├─jsp  
  27. │      Logon.jsp  
  28. │      Main.jsp  
  29. │      userForm.jsp  
  30. │      userList.jsp  
  31. │  
  32. ├─lib  
  33.        commons-collections-3.1.jar  
  34.        commons-logging-1.0.4.jar  
  35.        freemarker-2.3.8.jar  
  36.        log4j-1.2.9.jar  
  37.        ognl-2.6.11.jar  
  38.        struts2-core-2.0.6.jar  
  39.        xwork-2.0.1.jar  



分享到:
.
评论
13 楼 wjw103 2014-11-19  
You are using old notation for action redirect result. Change redirect-action to redirectAction.

http://stackoverflow.com/questions/15243002/there-is-no-result-type-defined-for-type-redirect-action-mapped-with-name-suc
12 楼 hhb19900618 2013-10-30  
你好 你这个工程压缩包是不是有问题啊?根本不能导入?
11 楼 myali88 2007-03-27  
加油!
10 楼 philip01 2007-03-26  
谢~你的文章....
9 楼 onlykwx 2007-03-26  
先表示感谢一下,再慢慢看!
8 楼 jamesby 2007-03-26  
piaochunzhi 写道
啊   一 看到 配置 文件 就 晕了 ,也没人给写写 XML的 注释!

是我太懒了吧 ,嘿嘿!
就是一个Interceptor和几个action.

如果想要完整的配制参考http://struts.apache.org/dtds/struts-2.0.dtd就可以了啊。

有些东西是自己发挥的,也不知道写的对不对,希望没有把大家引入歧途,另外有什么不正确的地方请批评指正。

7 楼 piaochunzhi 2007-03-26  
啊   一 看到 配置 文件 就 晕了 ,也没人给写写 XML的 注释!

是我太懒了吧 ,嘿嘿!
6 楼 qingzhuang 2007-03-26  
看看了
5 楼 andyandyandy 2007-03-26  
正在学习struts2,lz写得很详细,收了
4 楼 jamesby 2007-03-25  
Java代码
 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.enable.DynamicMethodInvocation" value="true" />  
  8.     <constant name="struts.devMode" value="true" />  
  9.     <constant name="struts.ui.templateDir" value="template" />       
  10.     <constant name="struts.ui.theme" value="simple" />      
  11.     <constant name="struts.ui.templateSuffix" value="ftl" />      
  12.     <include file="helloworld.xml"/>  
  13. </struts>  


struts.xml 文件配置成上面这样,是可以去掉table标签的,但是很多功能可能就不能正常了,特别是标签内容的显示和校验回显可能需要自己使用ongl手动调用,具体不清楚。

从struts2的结构看似乎它推荐使用模板语言,而且默认为freemarker,当然可以自己更改为velocity,看来还要搞定freemarker或者velocity后,struts2才算学习的完整。
3 楼 jamesby 2007-03-25  
现在就是有一个问题没有搞明白,在我的userForm.jsp文件中没有编写任何table之类的HTML代码,为什么struts2会帮我生成一个table.

默认好象使用template\xhtml\*.ftl文件作为模板,就是说struts2 默认使用freemarker作为模板,可是如何才能不使用任何模板呢?

Java代码
 收藏代码
  1. ### Standard UI theme  
  2. ### Change this to reflect which path should be used for JSP control tag templates by default  
  3. struts.ui.theme=xhtml  
  4. struts.ui.templateDir=template  
  5. #sets the default template type. Either ftl, vm, or jsp  
  6. struts.ui.templateSuffix=ftl  
2 楼 lijie250 2007-03-24  
正在学习中支持你啊~~
1 楼 jamesby 2007-03-24  
本事例首先自己编写了一个拦截器,确保未登陆的用户不能进行任何操作。

然后就是一个简单的CRUD的功能!